package tpi.obj3.planificador.interpreter

import org.eclipse.emf.common.util.URI
import org.eclipse.xtext.resource.XtextResourceSet
import tpi.obj3.planificador.PlanificadorStandaloneSetup
import tpi.obj3.planificador.extensions.ExtensionMethods
import tpi.obj3.planificador.planificador.Modelo
import com.google.inject.Injector
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.validation.IResourceValidator
import org.eclipse.xtext.validation.CheckMode

class PlanificadorInterpreter {
	
	extension ExtensionMethods extensionMethods = new ExtensionMethods
	
	def static void main(String[] args) {
		if(args.isEmpty) {
			throw new RuntimeException("Debe invocar este interprete con la ruta completa a un archivo .plan como argumento")
		}
		
		val fileName = args.get(0)
		val model = parsear(fileName)
		new PlanificadorInterpreter().interpret(model)
	}
	
	def static parsear(String fileName) {
		val injector = new PlanificadorStandaloneSetup()
						.createInjectorAndDoEMFRegistration()
		val resourceSet = injector.getInstance(XtextResourceSet)
		val resource = resourceSet.createResource(URI.createURI(fileName))
		resource.load(#{})
		validate(injector, resource)
		return resource.contents.get(0) as Modelo
	}
	
	def static validate(Injector injector, Resource resource) {
		val validator = injector.getInstance(IResourceValidator)
		val issues = validator.validate(resource, CheckMode.ALL, null)
		if (!issues.isEmpty) {
			issues.forEach[println(it.toString)]
			System.exit(-1)
		}
	}
	
	def interpret(Modelo modelo) {
		print(modelo.aulaMasUtilizada)
		println("+-------------------------+")
		print(modelo.horariosLibres)		
		println("+-------------------------+")
		print(modelo.porcentajesPorTurno)		
		println("+-------------------------+")
		print(modelo.materiasAsignadasDeDocentes)		
		println("+-------------------------+")
	}
	
	def aulaMasUtilizada(Modelo modelo)'''
		Aula mas usada: «modelo.planificacion.aulaMasUtilizada.name»
	'''
	
	def horariosLibres(Modelo it)'''
		«val dias = #["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"]»
		«val todosLosDias = planificacion.todosLosDias»
		«FOR clases : todosLosDias»
		Horarios libres («dias.get(todosLosDias.indexOf(clases))»):
			«FOR intervalo : horarioAbierto.restarIntervalos(horarios(clases))»
				«intervalo.toString»
			«ENDFOR»
		«ENDFOR»
	'''
	
	
	def materiasAsignadasDeDocentes(Modelo modelo)'''
		«FOR docente : modelo.docentes»
		«docente.name» dicta:
			«FOR materia : modelo.materiasQueDicta(docente)»
			- «materia.name»
			«ENDFOR»
			--
		«ENDFOR»
	'''
	
	def porcentajesPorTurno(Modelo it)'''
		«val cantMaterias = planificacion.materias.size»
		Año «planificacion.anio» 
		Semestre «planificacion.semestre»
		Cantidad de Materias: «cantMaterias»
		Turno Mañana: «porcentaje(planificacion.cantMateriasMañana, cantMaterias)»%
		Turno Tarde: «porcentaje(planificacion.cantMateriasTarde, cantMaterias)»%
		Turno Noche: «porcentaje(planificacion.cantMateriasNoche, cantMaterias)»%
	'''
	
	def porcentaje(Integer p, Integer c) {
		(p*100)/c
	}
	
}